#include <cstdio>
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;
__thread int count = 1; // 线程局部存储，这里用的是GCC / C, c++用的是thread_local
// 线程局部存储就是不想让我们的进程看到的是同一个变量，__thread 不能初始化为非字面类型（比如对象需要构造函数）
// 也就是能存储一些内置类型和部分的指针
// 知识点：
// 1、TLS 让每个线程拥有自己的变量副本
// 2、避免了共享变量带来的竞态条件
// 3、使用 thread_local 是最现代、简单的方式
// 4、对于 C 语言或动态对象，可以用 pthread_key_t
string Addr(int& c) {
    char addr[64];
    snprintf(addr, sizeof(addr), "%p", &c);
    return addr;
}
void* routine1(void* args) {
    while (true) {
        cout << "thread_1, count = " << count << "我这里进行了修改，" << "&count: " 
        << Addr(count) << endl;
        count++;
        sleep(1);
    }
}
void* routine2(void* args) {
    while (true) {
        cout << "thread_2, count = " << count << ", &count " << Addr(count) << endl;
        sleep(1);
    }
}
int main() {
    pthread_t tid1, tid2;
    pthread_create(&tid1, nullptr, routine1, nullptr);
    pthread_create(&tid2, nullptr, routine2, nullptr);

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);
    return 0;
}
